package com.zzyl.nursing.utlis;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;

/**
 * 身份证号解析工具类
 */
public class IdCardUtils {

    // 身份证号正则表达式（支持15位和18位）
    private static final Pattern ID_CARD_PATTERN = Pattern.compile("(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{2}[0-9Xx]$)");

    /**
     * 解析身份证号获取年龄
     * @param idCard 身份证号码
     * @return 年龄
     * @throws IllegalArgumentException 如果身份证号格式不正确
     */
    public static int parseAge(String idCard) {
        validateIdCard(idCard);
        LocalDate birthDate = extractBirthDate(idCard);
        return calculateAge(birthDate);
    }

    /**
     * 解析身份证号获取性别
     * @param idCard 身份证号码
     * @return 性别（0:男, 1:女）
     * @throws IllegalArgumentException 如果身份证号格式不正确
     */
    public static int parseGender(String idCard) {
        validateIdCard(idCard);
        return extractGender(idCard);
    }

    /**
     * 解析身份证号获取出生日期时间
     * @param idCard 身份证号码
     * @return 出生日期时间（当天的00:00:00）
     * @throws IllegalArgumentException 如果身份证号格式不正确
     */
    public static LocalDateTime parseBirthDateTime(String idCard) {
        validateIdCard(idCard);
        LocalDate birthDate = extractBirthDate(idCard);
        return birthDate.atStartOfDay();
    }

    /**
     * 验证身份证号格式
     * @param idCard 身份证号码
     * @throws IllegalArgumentException 如果身份证号格式不正确
     */
    private static void validateIdCard(String idCard) {
        if (idCard == null || idCard.trim().isEmpty()) {
            throw new IllegalArgumentException("身份证号不能为空");
        }

        // 基础长度验证
        int length = idCard.length();
        if (length != 15 && length != 18) {
            throw new IllegalArgumentException("身份证号长度不正确（应为15位或18位）");
        }

        // 正则表达式验证
        if (!ID_CARD_PATTERN.matcher(idCard).matches()) {
            throw new IllegalArgumentException("身份证号格式不正确");
        }


    }

    /**
     * 提取出生日期
     * @param idCard 身份证号码
     * @return 出生日期
     */
    private static LocalDate extractBirthDate(String idCard) {
        String birthDateStr;
        if (idCard.length() == 18) {
            // 18位身份证：YYYYMMDD
            birthDateStr = idCard.substring(6, 14);
        } else {
            // 15位身份证：YYMMDD，需要补全年份
            String year = "19" + idCard.substring(6, 8);
            birthDateStr = year + idCard.substring(8, 12);
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        return LocalDate.parse(birthDateStr, formatter);
    }

    /**
     * 计算年龄
     * @param birthDate 出生日期
     * @return 年龄
     */
    private static int calculateAge(LocalDate birthDate) {
        LocalDate currentDate = LocalDate.now();
        return Period.between(birthDate, currentDate).getYears();
    }

    /**
     * 提取性别
     * @param idCard 身份证号码
     * @return 性别（0:男, 1:女）
     */
    private static int extractGender(String idCard) {
        String genderCode;
        if (idCard.length() == 18) {
            // 18位身份证：第17位是性别代码
            genderCode = idCard.substring(16, 17);
        } else {
            // 15位身份证：第15位是性别代码
            genderCode = idCard.substring(14, 15);
        }

        int code = Integer.parseInt(genderCode);
        // 奇数表示男性，偶数表示女性
        return code % 2 == 1 ? 0 : 1;
    }




}